// ==UserScript==
// @name         Bilibili 自定义播放速度
// @namespace    https://gitee.com/joyanbian/tampermonkey_bilibili-video-speed
// @version      1.0.0
// @description  为Bilibili视频播放器添加自定义播放速度选项，支持用户自定义速度。
// @author       liarjo
// @match        https://www.bilibili.com/video/*
// @icon         https://www.bilibili.com/favicon.ico
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @license      MIT
// @updateURL    https://gitee.com/joyanbian/tampermonkey_bilibili-video-speed/raw/master/meta.js
// @downloadURL  https://gitee.com/joyanbian/tampermonkey_bilibili-video-speed/raw/master/speed.js
// ==/UserScript==

(function () {
    'use strict';

    // 播放速度菜单
    let menu = null;

    // 默认速度选项
    const defaultSpeeds = [
        { value: 3, label: '3.0x' },
        { value: 3.5, label: '3.5x' },
        { value: 4, label: '4.0x' },
    ];

    // 获取用户设置的速度选项
    let userSpeeds = GM_getValue('speeds', defaultSpeeds);

    // 监听DOM变化
    const targetNode = document.body;
    const config = { childList: true, subtree: true };

    const observer = new MutationObserver((mutationsList, observer) => {
        menu = document.querySelector('.bpx-player-ctrl-playbackrate-menu');
        if (menu) {
            // 清空之前添加的选项
            const existingItems = menu.querySelectorAll('.custom-speed-item');
            existingItems.forEach(item => item.remove());

            // 添加用户设置的速度选项
            addCustomSpeeds(userSpeeds, menu);

            // 停止观察，避免重复添加
            observer.disconnect();
        }
    });

    const addCustomSpeeds = (speeds, menu) => {
        speeds.forEach(speed => {
            const li = document.createElement('li');
            li.className = 'bpx-player-ctrl-playbackrate-menu-item custom-speed-item';
            li.setAttribute('data-value', speed.value);
            li.textContent = speed.label;
            menu.insertBefore(li, menu.firstChild);
        });
    };

    // 启动观察
    setTimeout(() => {
        observer.observe(targetNode, config);
    }, 1000);

    // 注册菜单命令，允许用户修改速度选项
    GM_registerMenuCommand('设置自定义播放速度', () => {
        const input = prompt('请输入自定义速度选项（格式：3.0x,3.5x,4.0x），留空则恢复默认：', userSpeeds.map(s => s.label).join(','));
        if (input !== null) { // 用户点击了确定或取消
            if (!input) {
                // 用户清空输入，恢复默认速度选项
                GM_setValue('speeds', defaultSpeeds);
                userSpeeds = defaultSpeeds;
                alert('已恢复默认播放速度选项！');
            } else {
                try {
                    const newSpeeds = input.split(',').map(item => {
                        const trimmedItem = item.trim();
                        // 使用正则表达式提取完整的数字部分（包括小数点）
                        const match = trimmedItem.match(/^(\d+(\.\d+)?)x$/i);
                        if (!match) {
                            throw new Error('输入格式不正确，请使用类似 3.0x 的格式');
                        }
                        const speedValue = parseFloat(match[1]);
                        if (isNaN(speedValue) || speedValue <= 0) {
                            throw new Error('速度值必须为正数');
                        }
                        // 使用用户输入的数字部分生成标签
                        const label = `${match[1]}x`;
                        return { value: speedValue, label };
                    });

                    // 保存用户设置
                    GM_setValue('speeds', newSpeeds);
                    userSpeeds = newSpeeds;
                    alert('自定义播放速度已更新！');
                } catch (error) {
                    alert(`输入格式错误：${error.message}`);
                    return; // 不更新速度选项
                }
            }

            // 添加用户设置的速度选项
            addCustomSpeeds(userSpeeds, menu);
        }
    });
})();